在前面二十幾天的介紹,我似乎忘了很重要的一個物件 Namespac。
k8s 使用 namespaces 來管理資源,以此作為資源隔離的方法。我們也可以透過 namespace 將其叢集劃分成不同的虛擬子叢集。
namespaces 僅適用於 pods、deployment 與 services 等 namespaces 物件,不適用於 cluster-wide(叢集範圍)物件,如 persisten volume 與 node。
查詢不適用 namespaces 的資源:
kubectl api-resources --namespaced=false
。
查詢適用 namespace 的資源:kubectl api-resources --namespaced=true
。
查看叢集中的 namespaces。
kubectl get ns
NAME STATUS AGE
default Active 20d
kube-node-lease Active 20d
kube-public Active 20d
kube-system Active 20d
叢集一開始就有四個預設的 namespaces:
kube-system
:主要用於 k8s 建立的系統程序與物件,一般不會去動到這個 namespace 的物件。kube-pulic
:所有使用者皆可存取該 namespace 的資源。kube-node-lease
:主要是與 node 相關的 lease object,lease object 用於定期監控節點狀態。default
:若沒有建立新的 namespace,一開始建立的資源其 namespace 自動設為 default。建立 namespaces 有兩種方式:
建立一個 namespace 為 develop。
kubectl create namespace develop
kubectl get ns
NAME STATUS AGE
default Active 20d
develop Active 4s
kube-node-lease Active 20d
kube-public Active 20d
kube-system Active 20d
以下為 ns-develop.yaml
apiVersion: v1
kind: Namespace
metadata:
name: develop
labels:
name: develop
執行以下指令建立 namespace。
kubectl create -f ns-develop.yaml
以下建立一個 image 為 nginx 的 pod 並設定 namespace 為 develop。
kubectl run nginx --image=nginx --namespace=develop
pod/nginx created
或是在 pod.yaml
中註明其 namespace。
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: develop
spec:
containers:
- image: nginx
name: nginx
建立 namespace。
kubectl create -f pod.yaml
pod/nginx created
查看該資源。
kubectl get po -n develop
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 70s
執行以下指令。
kubectl delete ns develop
namespace "develop" deleted
因每次查看 namespaces 中的資源其指令都需要填上 -n namespace-name
,我們可以透過以下指令將後續的情境(context)都設定在某 namespace 上,就不需要每次指令都要填上 -n
參數。
kubectl config set-context --current --namespace=develop
Context "minikube" modified.
測試一下。
kubectl config view --minify | grep namespace:
namespace: develop
查看該 pod 的 namespace。
kubectl get pod nginx -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-10-12T15:45:23Z"
name: nginx
namespace: develop
resourceVersion: "65133"
...